/*************************************************************************

            (c) Copyright 2019 by 天翼物联科技有限公司. All rights reserved.

*************************************************************************/
#ifndef _CTIOT_MQTT_SDK_TMODEL_H
#define _CTIOT_MQTT_SDK_TMODEL_H

#ifdef __cplusplus
{
#endif

#include "ctiot_mqtt_sdk.h"

#if DATA_MODE > 0

#define MAX_PARA_COUNT 2

//*************************************************
//
//! @addtogroup CTIOT_MQTT_PARA的结构体
//!
//! @{
//
//*************************************************
typedef enum{
	CTIOT_INT,
	CTIOT_DOUBLE,
	CTIOT_FLOAT,
	CTIOT_STR,
	CTIOT_ENUM,
	CTIOT_BOOL,
	CTIOT_DATE,
}CTIOT_PARA_TYPE;
typedef struct
{
	int32_t max;
	int32_t min;
	int32_t val;
} CtiotIntItem;
typedef struct
{
	double max;
	double min;
	double val;
} CtiotDoubleItem;
typedef struct
{
	float max;
	float min;
	float val;
} CtiotFloatItem;
typedef struct
{
	uint16_t maxLen;
	uint16_t minLen;
	char *val;
} CtiotStrItem;
typedef struct
{
	int32_t maxLen;
	int32_t minLen;
int32_t val;
} CtiotEnumItem;
typedef struct
{
	int32_t max;
	int32_t min;
	int32_t val;
} CtiotBoolItem;
typedef struct
{
	uint64_t max;
	uint64_t min;
	uint64_t val;
} CtiotDateItem;
typedef struct
{
	CTIOT_PARA_TYPE ctiotParaType;
	char *paraName;
	union {
		CtiotStrItem ctiotStr;
		CtiotFloatItem ctiotFloat;
		CtiotDoubleItem ctiotDouble;
		CtiotDateItem ctiotDate;
		CtiotIntItem ctiotInt;
		CtiotBoolItem ctiotBool;
		CtiotEnumItem ctiotEnum;
	} u;
} CtiotParamItems;
typedef struct CtiotMqttPara
{
	uint32_t count;
	CtiotParamItems paraList[MAX_PARA_COUNT];
}CtiotMqttPara;

//*************************************************
//
//! @addtogroup service为温湿度上报的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	float temperature_data;	//!< 温度数据
	int32_t humidity_data;	//!< 湿度数据
}DataReportS;

//*************************************************
//
//! @addtogroup service为温湿度上报周期配置的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	uint32_t taskId;	//!< taskId
	int32_t report_period;	//!< 上报周期
}SetReportPeriodS;

//*************************************************
//
//! @addtogroup service为空调开关控制响应的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	uint32_t taskId;	//!< taskId
	int32_t air_conditioner_onoff;	//!< 空调开关
	int32_t act_result;	//!< 指令执行结果
}AirConditionerOnoffRespS;

//*************************************************
//
//! @addtogroup service为空调开关控制的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	uint32_t taskId;	//!< taskId
	int32_t air_conditioner_onoff;	//!< 空调开关
}AirConditionerOnoffCmdS;

//*************************************************
//
//! @addtogroup service为红外传感器上报的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	int32_t ir_sensor_data;	//!< 红外传感器数据
}IrSensorReportS;

//*************************************************
//
//! @addtogroup service为设备信息上报的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	char* hardware_version;	//!< 硬件版本
	char* software_version;	//!< 软件版本
}InfoReportS;

//*************************************************
//
//! @addtogroup service为温湿度自动上报设置响应的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	uint32_t taskId;	//!< taskId
	int32_t auto_control;	//!< 自动上报标志
	int32_t act_result;	//!< 指令执行结果
}SetAutoControlRespS;

//*************************************************
//
//! @addtogroup service为温湿度自动上报设置的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	uint32_t taskId;	//!< taskId
	int32_t auto_control;	//!< 自动上报标志
}SetAutoControlS;

//*************************************************
//
//! @addtogroup service为温湿度上报周期配置响应的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
	mqtt_qos_e qos;	//!< QOS等级
	uint32_t taskId;	//!< taskId
	int32_t report_period;	//!< 上报周期
	int32_t act_result;	//!< 指令执行结果
}SetReportPeriodRespS;

//*************************************************
//!
//! @addtogroup service为CtiotSrvCbS的数据结构体
//!
//! @{
//
//*************************************************
typedef struct
{
#if (DATA_MODE == 1 || DATA_MODE == 2)
	void (*set_report_period_callback)(char *);	//!< 温湿度上报周期配置的回调
	void (*air_conditioner_onoff_cmd_callback)(char *);	//!< 空调开关控制的回调
	void (*set_auto_control_callback)(char *);	//!< 温湿度自动上报设置的回调
#elif DATA_MODE == 3
	void (*set_report_period_callback)(SetReportPeriodS *);	//!< 温湿度上报周期配置的回调
	void (*air_conditioner_onoff_cmd_callback)(AirConditionerOnoffCmdS *);	//!< 空调开关控制的回调
	void (*set_auto_control_callback)(SetAutoControlS *);	//!< 温湿度自动上报设置的回调
#endif
} CtiotSrvCbS;

enum CTIOT_MQTT_AIR_CONDITIONER_ONOFF_9001{
	ctiot_mqtt_air_conditioner_onoff_9001_0 = 0,//!<   关闭
	ctiot_mqtt_air_conditioner_onoff_9001_1 = 1,//!<   开启
};
enum CTIOT_MQTT_ACT_RESULT_9001{
	ctiot_mqtt_act_result_9001_0 = 0,//!<   执行成功
	ctiot_mqtt_act_result_9001_1 = 1,//!<   执行失败
};
enum CTIOT_MQTT_AIR_CONDITIONER_ONOFF_8001{
	ctiot_mqtt_air_conditioner_onoff_8001_0 = 0,//!<   关闭
	ctiot_mqtt_air_conditioner_onoff_8001_1 = 1,//!<   开启
};
enum CTIOT_MQTT_IR_SENSOR_DATA_1001{
	ctiot_mqtt_ir_sensor_data_1001_0 = 0,//!<   未遮挡
	ctiot_mqtt_ir_sensor_data_1001_1 = 1,//!<   遮挡
};
enum CTIOT_MQTT_AUTO_CONTROL_9002{
	ctiot_mqtt_auto_control_9002_0 = 0,//!<   关闭
	ctiot_mqtt_auto_control_9002_1 = 1,//!<   开启
};
enum CTIOT_MQTT_ACT_RESULT_9002{
	ctiot_mqtt_act_result_9002_0 = 0,//!<   执行成功
	ctiot_mqtt_act_result_9002_1 = 1,//!<   执行失败
};
enum CTIOT_MQTT_AUTO_CONTROL_8002{
	ctiot_mqtt_auto_control_8002_0 = 0,//!<   关闭
	ctiot_mqtt_auto_control_8002_1 = 1,//!<   开启
};
enum CTIOT_MQTT_ACT_RESULT_9003{
	ctiot_mqtt_act_result_9003_0 = 0,//!<   执行成功
	ctiot_mqtt_act_result_9003_1 = 1,//!<   执行失败
};

//**************************************************
//
//! @brief 下行回调
//!
//! @param void*
//!
//! @retval  无
//!
//**************************************************
void CtiotDnMqttData(void *md);

#if (DATA_MODE == 2 || DATA_MODE == 3  )
//**************************************************
//
//! @brief 初始化json
//!
//! @param 无
//!
//! @retval  无
//!
//**************************************************
void CtiotTmodelInit(void);

//**************************************************
//
//! @brief 分离模式下释放编码后的payload空间
//!
//! @param void*
//!
//! @retval  无
//!
//**************************************************
void CtiotTmodelFree(void *p);

//**************************************************
//
//! @brief 数据上报报文编码功能
//!
//! @param para 参数结构体
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttMsgEncode(CtiotMqttPara para, char **payload);

//**************************************************
//
//! @brief 指令响应报文编码功能
//!
//! @param para 参数结构体
//! @param taskId 消息ID
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttMsgResponseEncode(CtiotMqttPara para, uint32_t taskId, char **payload);

//**************************************************
//
//! @brief service为温湿度上报
//!
//! @param DataReportS 参见@ref DataReportS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeDataReport(DataReportS* para,char** payload);

//**************************************************
//
//! @brief service为温湿度上报周期配置
//!
//! @param payload 输入payload
//! @param SetReportPeriodS 参见@ref SetReportPeriodS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttDecodeSetReportPeriodPara(char *payload,SetReportPeriodS* outPara);

//**************************************************
//
//! @brief service为空调开关控制响应
//!
//! @param AirConditionerOnoffRespS 参见@ref AirConditionerOnoffRespS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeAirConditionerOnoffResp(AirConditionerOnoffRespS* para,char** payload);

//**************************************************
//
//! @brief service为空调开关控制
//!
//! @param payload 输入payload
//! @param AirConditionerOnoffCmdS 参见@ref AirConditionerOnoffCmdS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttDecodeAirConditionerOnoffCmdPara(char *payload,AirConditionerOnoffCmdS* outPara);

//**************************************************
//
//! @brief service为红外传感器上报
//!
//! @param IrSensorReportS 参见@ref IrSensorReportS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeIrSensorReport(IrSensorReportS* para,char** payload);

//**************************************************
//
//! @brief service为设备信息上报
//!
//! @param InfoReportS 参见@ref InfoReportS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeInfoReport(InfoReportS* para,char** payload);

//**************************************************
//
//! @brief service为温湿度自动上报设置响应
//!
//! @param SetAutoControlRespS 参见@ref SetAutoControlRespS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeSetAutoControlResp(SetAutoControlRespS* para,char** payload);

//**************************************************
//
//! @brief service为温湿度自动上报设置
//!
//! @param payload 输入payload
//! @param SetAutoControlS 参见@ref SetAutoControlS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttDecodeSetAutoControlPara(char *payload,SetAutoControlS* outPara);

//**************************************************
//
//! @brief service为温湿度上报周期配置响应
//!
//! @param SetReportPeriodRespS 参见@ref SetReportPeriodRespS
//! @param payload 输出编码后的payload
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttEncodeSetReportPeriodResp(SetReportPeriodRespS* para,char** payload);

#if (DATA_MODE == 3)
//**************************************************
//
//! @brief service为温湿度上报
//!
//! @param DataReportS 参见@ref DataReportS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendDataReportData(DataReportS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

//**************************************************
//
//! @brief service为空调开关控制响应
//!
//! @param AirConditionerOnoffRespS 参见@ref AirConditionerOnoffRespS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendAirConditionerOnoffRespData(AirConditionerOnoffRespS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

//**************************************************
//
//! @brief service为红外传感器上报
//!
//! @param IrSensorReportS 参见@ref IrSensorReportS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendIrSensorReportData(IrSensorReportS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

//**************************************************
//
//! @brief service为设备信息上报
//!
//! @param InfoReportS 参见@ref InfoReportS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendInfoReportData(InfoReportS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

//**************************************************
//
//! @brief service为温湿度自动上报设置响应
//!
//! @param SetAutoControlRespS 参见@ref SetAutoControlRespS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendSetAutoControlRespData(SetAutoControlRespS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

//**************************************************
//
//! @brief service为温湿度上报周期配置响应
//!
//! @param SetReportPeriodRespS 参见@ref SetReportPeriodRespS
//!
//! @retval  CTIOT_RESULT_CODE 返回结果码
//!
//**************************************************
CTIOT_RESULT_CODE CtiotMqttSendSetReportPeriodRespData(SetReportPeriodRespS* para,mqtt_qos_e qos, ctiot_mqtt_msg_s *ptrMsg);

#endif
#endif

#endif // DATA_MODE > 0

#ifdef __cplusplus
}
#endif

#endif //#define _CTIOT_MQTT_SDK_TMODEL_H
